import _ from 'underscore'
import deepClone from './deepClone'
import FormatDate from './FormatDate'
import RandomString from './RandomString'
import getAllDate from './getAllDate'

const Helper =  {
    
    /**
     * 深度拷贝
     * @param {object} 对象
     * @return {object}
     */
    deepClone,

    /**
     * 日期格式化
     * @param {date} timestamp 日期/时间戳
     * @param {string} format 格式 默认值 Y-m-d
     * @return {string}
     */
    FormatDate,

    /**
     * 获取指定日期之间的所有日期
     * 日期格式 yyyy-MM-dd
     * @param {string} start 开始日期
     * @param {string} start 结束日期
     * @return {array}
     */
    getAllDate,

    /**
     * 随机字符串
     * @param {boolean} lower 小写字母
     * @param {boolean} upper 大写字母
     * @param {boolean} number 数字
     * @param {boolean} symbol 特殊字符
     * @param {boolean} length 长度
    */

    RandomString,

    /**
     * 计算请求分页参数
     * @param {object} route 当前页面路由
     * @return { limit: 10, page: 1, offset: 0 } limit = 长度, page = 页码, offset = 偏移量
     */
    getPerPage(query) {
        let limit = parseInt(query.limit) || 10 ,
            page = parseInt(query.page) || 1,
            offset = (page - 1) * limit;
        return {
            limit, page, offset
        }
    },

    /**
     * 清理对象
     * 去除属性值为 空(字符串), null, undefined
     * 转换值为数字,true,false的字符串为对应的数据类型
     * @param {object} obj 对象
     * @return {object}
     */
    clearObject(obj) {
        let o = {};
        for (const k in obj) {
            let v = obj[k];
            if ( v === null || v === undefined ) continue;
            // 非字符串
            if (toString.call(v) !== '[object String]') {
                o[k] = v;
                continue;
            }
            v = obj[k].trim();
            // 过滤空值
            if (v.length === 0 ) continue;

            // 正数,负数,浮点数
            if (/^(-?\d+)(\.\d+)?$/.test(v) ) {
                o[k] = Number(v);
            }
            // 布尔值
            else if (v==='true' || v==='false') {
                o[k] = (v==='true');
            }
            // false
            else {
                o[k] = v;
            }
        }
        return o;
    },

    /**
     * 获取几天前的日期
     * @param {date} date 日期 
     * @param {number} days 天数
     * @return {date}
     */
    getBeforeDay(date, days) {
        let d = new Date(date); 
        d.setDate(d.getDate()-days); 
        return d; 
    },
    
    /**
     * 获取几个月前的日期
     * @param {date} date 日期 
     * @param {number} month 月数
     * @return {date}
     */
    getBeforeMonth(date, month) {
        let d = new Date(date); 
        d.setMonth( d.getMonth() - month );
        return d; 
    }
}


export default Helper;